package main

import (
	"encoding/json"
	"fmt"
)

/*
func Marshal(v interface{}) ([]byte, error)
Marshal函数返回v的json编码。
空接口可以接收任何类型
*/
//定义一个结构体
//注意：对于结构体的序列化，如果希望序列化后的key的名字，由自己重新制定，那么可以给struct制定一个tag标签，比如首写字母为小写的key就需要tag标签，不然json包访问不到
type Monster struct {
	Name     string `json:"monster_name"` //反射机制
	Age      int    `json:"monster_age"`
	Birthday string
	Sal      float64
	Skill    string
}

//1、结构体序列化
func testStruct() {
	//演示
	monster := Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2021-08-04",
		Sal:      8000.0,
		Skill:    "牛魔拳",
	}
	//将monster序列化
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("序列化失败err=%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("monster序列化后=%v\n", string(data))
}

//2将map进行序列化
func testMap() {
	//定义一个map
	var a map[string]interface{}
	//使用map，需要make
	a = make(map[string]interface{})
	a["name"] = "红孩儿"
	a["age"] = 30
	a["address"] = "洪崖洞"
	//将a这个map进行序列化
	data, err := json.Marshal(a)
	if err != nil {
		fmt.Printf("序列化后错误err=%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("map a序列化后=%v\n", string(data))
}

//3、将切片进行序列化
func testSlice() {
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	var m2 map[string]interface{}
	//使用map前，需要先make
	m1 = make(map[string]interface{})
	m1["name"] = "jack"
	m1["age"] = 7
	m1["address"] = "武汉"
	slice = append(slice, m1)
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = 20
	m2["address"] = [2]string{"天门", "武汉"}
	slice = append(slice, m2)
	//将slice序列化
	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("序列化后错误err=%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("slice序列化后=%v\n", string(data))

}

//4、对基本数据类型序列化
//对基本数据类型序列化意义不大
func testFloat64() {
	var num1 float64 = 2345.6
	//对num1进行序列化
	data, err := json.Marshal(num1)
	if err != nil {
		fmt.Printf("序列化失败err=%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("num1序列化后=%v\n", string(data))
}
func main() {
	//1、结构体序列化
	testStruct()
	//2、map序列化
	testMap()
	//3、切片序列化
	testSlice()
	//4、对基本数据类型序列化
	testFloat64()
}
